import Axios, { AxiosInstance } from "axios";
import { getToken, removeToken } from "./Auth";
import { ENV_DEV, ENV_PRO, NOW_ENV } from "../config/EnvironmentConfig";

const instance: AxiosInstance = Axios.create({
    baseURL: NOW_ENV === 'dev' ? ENV_DEV : ENV_PRO,
    timeout: 15000,
    headers: {
        'Content-Type': "application/json;charset=utf-8"
    }
})
/** 
 * 请求拦截器 
 * 每次请求前，如果存在token则在请求头中携带token 
 */
instance.interceptors.request.use(
    config => {

        // 登录流程控制中，根据本地是否存在token判断用户的登录情况        
        // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token        
        // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码        
        // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。        
        const token = getToken();
        token && (config!.headers!.token = token);

        return config;
    },
    error => {
        ElMessage({
            showClose: true,
            message: error.data.MSG,
            type: "error",
        });
        return Promise.reject(error.data.MSG);
    }

)

/*
 * TODO
 * 若返回token过期则删除localStorage里面的token
*/
instance.interceptors.response.use(
    res => {
        if (res.data.STATUS_CODE === '536') {
            //无效token
            removeToken();

            ElNotification({
                title: 'Warning',
                message: '用户信息已过期，请重新登录，否则相关功能无法使用,页面将在5s后刷新。',
                type: 'warning',
            })
            setTimeout(() => {
                location.reload();
            }, 5000);
        }
        return Promise.resolve(res)

    },
    err => {
        ElMessage({
            showClose: true,
            message: err.data.MSG,
            type: 'error',
            duration: 5 * 1000
        })
    }
)


const request: AxiosInstance = Axios.create({
    timeout: 15000
})

export { instance, request };